﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;

namespace MiraPark
{
    public partial class FormCadastroUsuario : Form
    {
        private string operacao = "";
        
        public FormCadastroUsuario()
        {
            InitializeComponent();
        }

        private void FormCadastroUsuario_Load(object sender, EventArgs e)
        {
            //Popular a lista de usuarios cadastrados
            this.dataGridViewPerfis.DataSource = ModelBO.getPerfis();
            this.dataGridViewObjetos.DataSource = ModelBO.getObjetos();
            this.dataGridViewUsuarios.DataSource = ModelBO.getUsuarios(true, true);

            this.panelPerfis.Visible = false;
            this.panelObjetos.Visible = false;
            setupButtonsControls();
            timer1.Enabled=true;
        }

        private void dataGridViewUsuarios_SelectionChanged(object sender, EventArgs e)
        {
            setupButtonsControls();
            setupPerfisObjetos();
        }

        private void buttonNovo_Click(object sender, EventArgs e)
        {
            this.operacao = "novo";
            setupButtonsControls();
            setupPerfisObjetos();
        }

        private void buttonCancelar_Click(object sender, EventArgs e)
        {
            this.operacao = "cancelar";
            setupButtonsControls();
            this.setupPerfisObjetos();
        }

        private void buttonEditar_Click(object sender, EventArgs e)
        {
            this.operacao = "editar";
            setupButtonsControls();
        }

        private void buttonExcluir_Click(object sender, EventArgs e)
        {
            this.operacao = "excluir";

            List<UsuarioVO> userList = (List<UsuarioVO>)this.dataGridViewUsuarios.DataSource;
            UsuarioVO user = userList[this.dataGridViewUsuarios.CurrentRow.Index];
            DialogResult dr = MessageBox.Show(this, "Confirma a exclusão do usuário " + user.nome, "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {
                ModelBO.delUsuarioXObjetos(user.usuarioXObjetoVOs);
                ModelBO.delPerfilXUsuarios(user.perfilxUsuarioVOs);
                ModelBO.delUsuario(user);

                int nRow = this.dataGridViewUsuarios.CurrentRow.Index;
                this.dataGridViewUsuarios.DataSource = ModelBO.getUsuarios(true, true);
                if (this.dataGridViewUsuarios.Rows.Count > 0)
                {
                    dataGridViewUsuarios.CurrentCell = dataGridViewUsuarios.Rows[Math.Min(nRow, this.dataGridViewUsuarios.Rows.Count - 1)].Cells[1];
                    dataGridViewUsuarios.Rows[Math.Min(nRow, this.dataGridViewUsuarios.Rows.Count - 1)].Selected = true;
                }

                setupButtonsControls();
                setupPerfisObjetos();
            }
        }

        private void buttonSalvar_Click(object sender, EventArgs e)
        {
            String erros = "";
            if (this.textBoxUsuario.Text.Trim().Length == 0)
                erros = erros + "Usuario deve ser informado.\r\n";
            if (!this.textBoxPass.Text.Equals(this.textBoxPass2.Text))
                erros = erros + "Senha e Confirmação de Senha devem ser iguais.";
            if (this.textBoxNome.Text.Trim().Length == 0)
                erros = erros + "Nome do Usuário deve ser informado.\r\n";
            if (erros.Length > 0)
            {
                MessageBox.Show(this, erros, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            UsuarioVO user = null;

            if (this.operacao.Equals("novo"))
            {

                user = UsuarioVO.CreateUsuarioVO();
                user.usuario = this.textBoxUsuario.Text;
                user.nome = this.textBoxNome.Text;
                user.senha = this.textBoxPass.Text;
                user.ativo = this.checkBoxAtivo.Checked;
                user.cadastro = DateTime.Today;

                user.idUsuario = (int)ModelBO.newUsuario(user);
            }
            if (this.operacao.Equals("editar"))
            {
                List<UsuarioVO> userList = (List<UsuarioVO>)this.dataGridViewUsuarios.DataSource;
                user = userList[this.dataGridViewUsuarios.CurrentRow.Index];

                user.usuario = this.textBoxUsuario.Text;
                user.nome = this.textBoxNome.Text;
                if (this.textBoxPass.Text.Trim().Length > 0)
                    user.senha = this.textBoxPass.Text;
                user.ativo = this.checkBoxAtivo.Checked;

                List<UsuarioxObjetoVO> usuarioxObjetoVOs = new List<UsuarioxObjetoVO>();
                List<PerfilxUsuarioVO> perfilxUsuarioVOs = new List<PerfilxUsuarioVO>();

                int count = 0;
                foreach (PerfilVO perf in (List<PerfilVO>)this.dataGridViewPerfis.DataSource)
                {
                    if ((bool)this.dataGridViewPerfis.Rows[count].Cells["usuarioxperfil"].Value)
                    {
                        perfilxUsuarioVOs.Add(PerfilxUsuarioVO.CreatePerfilxUsuarioVO((int)this.dataGridViewPerfis.Rows[count].Cells["idPerfil"].Value, user.idUsuario));
                    }
                    count++;
                }
                count = 0;
                foreach (ObjetoVO perf in (List<ObjetoVO>)this.dataGridViewObjetos.DataSource)
                {
                   DataGridViewCellCollection dgvcc = this.dataGridViewObjetos.Rows[count].Cells;
                   if (dgvcc["usuarioxobjeto"].Value!=null && (bool)dgvcc["usuarioxobjeto"].Value)
                    {
                        usuarioxObjetoVOs.Add(UsuarioxObjetoVO.CreateUsuarioxObjetoVO(user.idUsuario, (int)dgvcc["idObjeto"].Value, (bool)dgvcc["visivel"].Value, (bool)dgvcc["habilitado"].Value));
                    }
                    count++;
                }

                ModelBO.delPerfilXUsuarios(user.perfilxUsuarioVOs);
                ModelBO.newPerfilXUsuarios(perfilxUsuarioVOs);
                ModelBO.delUsuarioXObjetos(user.usuarioXObjetoVOs);
                ModelBO.newUsuarioXObjetos(usuarioxObjetoVOs);
                ModelBO.setUsuario(user);
            }
            this.operacao = "salvar";

            List<UsuarioVO> listUsuarioVOs = ModelBO.getUsuarios(true, true);
            dataGridViewUsuarios.DataSource = listUsuarioVOs;
            int nRow = listUsuarioVOs.FindIndex(a => a.idUsuario == user.idUsuario);
            dataGridViewUsuarios.CurrentCell = dataGridViewUsuarios.Rows[nRow].Cells[1];
            dataGridViewUsuarios.Rows[nRow].Selected = true;

            setupPerfisObjetos();
            setupButtonsControls();
        }

        private void setupPerfisObjetos(){
            if (this.dataGridViewUsuarios.CurrentRow != null){
                setupPerfisObjetos(this.dataGridViewUsuarios.CurrentRow.Index);
            }
        }
        private void setupPerfisObjetos( int rowIndex)
        {

            List<UsuarioVO> userList = (List<UsuarioVO>)this.dataGridViewUsuarios.DataSource;
            UsuarioVO user = null;

            if (this.dataGridViewUsuarios.CurrentRow == null || this.dataGridViewUsuarios.RowCount==0){
                user = UsuarioVO.CreateUsuarioVO();
                user.idUsuario=-1;
            }
            else{
                user = userList[rowIndex];
            }

            if (this.dataGridViewUsuarios.CurrentRow != null)
            {
                int count = 0;
                foreach (PerfilVO perf in (List<PerfilVO>)this.dataGridViewPerfis.DataSource)
                {
                    DataGridViewRow dgv = this.dataGridViewPerfis.Rows[count];
                    PerfilxUsuarioVO perfilxUsuarioVO = PerfilxUsuarioVO.CreatePerfilxUsuarioVO(perf.idPerfil, user.idUsuario);

                    dgv.Cells["usuarioxperfil"].Value = (!operacao.Equals("novo") && user.perfilxUsuarioVOs.Contains(perfilxUsuarioVO, new PerfilxUsuarioVOComparer()));

                    count++;
                }
                this.dataGridViewPerfis.Refresh();

                count = 0;
                foreach (ObjetoVO obj in (List<ObjetoVO>)this.dataGridViewObjetos.DataSource)
                {
                    DataGridViewRow dgv = this.dataGridViewObjetos.Rows[count];
                    UsuarioxObjetoVO usuarioxObjetoVO = UsuarioxObjetoVO.CreateUsuarioxObjetoVO(user.idUsuario, obj.idObjeto, false, false);

                    if (!operacao.Equals("novo") && user.usuarioXObjetoVOs.Contains(usuarioxObjetoVO, new UsuarioxObjetoVOComparer()))
                    {
                        dgv.Cells["usuarioxobjeto"].Value = true;
                        usuarioxObjetoVO = user.usuarioXObjetoVOs.Find(delegate(UsuarioxObjetoVO uxo) { return uxo.idObjeto == usuarioxObjetoVO.idObjeto; });
                        dgv.Cells["visivel"].Value = usuarioxObjetoVO.visivel;
                        dgv.Cells["habilitado"].Value = usuarioxObjetoVO.habilitado;
                    }
                    else
                    {
                        dgv.Cells["usuarioxobjeto"].Value = false;
                        dgv.Cells["visivel"].Value = false;
                        dgv.Cells["habilitado"].Value = false;
                    }
                    count++;
                }
                this.dataGridViewObjetos.Refresh();
            }
        }

        private void setupButtonsControls()
        {
            bool haRows = this.dataGridViewUsuarios.Rows.Count > 0 && this.dataGridViewUsuarios.CurrentRow!=null;
            bool novo = this.operacao.Equals("novo");
            bool edit = this.operacao.Equals("editar");
            bool canc = this.operacao.Equals("cancelar");

            this.radioButton2.Enabled = !novo;
            this.radioButton3.Enabled = !novo;

            this.buttonCancelar.Enabled = novo || edit;
            this.buttonNovo.Enabled = !novo && !edit;
            this.buttonEditar.Enabled = haRows && !novo && !edit;
            this.buttonExcluir.Enabled = haRows && !novo && !edit;
            this.buttonSalvar.Enabled = novo || edit;

            this.textBoxUsuario.Enabled = novo || edit;
            this.textBoxNome.Enabled = novo || edit;
            this.textBoxPass.Enabled = novo || edit;
            this.textBoxPass2.Enabled = novo || edit;
            this.checkBoxAtivo.Enabled = novo || edit;

            this.dataGridViewUsuarios.Enabled = !novo && !edit;
            this.dataGridViewPerfis.Columns["usuarioxperfil"].ReadOnly = !edit;
            this.dataGridViewObjetos.Columns["usuarioxobjeto"].ReadOnly = !edit;
            this.dataGridViewObjetos.Columns["visivel"].ReadOnly = !edit;
            this.dataGridViewObjetos.Columns["habilitado"].ReadOnly = !edit;


            if (!haRows || novo)
            {
                this.textBoxId.Text = "";
                this.textBoxUsuario.Text = "";
                this.textBoxNome.Text = "";
                this.textBoxPass.Text = "";
                this.textBoxPass2.Text = "";
                this.checkBoxAtivo.Checked = false;
                if (novo)
                {
                    this.labelDataCadastro.Text = System.DateTime.Today.ToString("dd/MM/yyyy");
                }
                else
                {
                    this.labelDataCadastro.Text = "";
                }
            }
            else {
                List<UsuarioVO> userList = (List<UsuarioVO>)this.dataGridViewUsuarios.DataSource;
                UsuarioVO user = userList[this.dataGridViewUsuarios.CurrentRow.Index];
                this.textBoxId.Text = user.idUsuario.ToString();
                this.textBoxUsuario.Text = user.usuario;
                this.textBoxNome.Text = user.nome;
                this.textBoxPass.Text = "";
                this.textBoxPass2.Text = "";
                this.checkBoxAtivo.Checked = user.ativo;
                this.labelDataCadastro.Text = System.DateTime.Parse(user.cadastro.ToString()).ToString("dd/MM/yyyy");
            }
            if (novo || edit){
                this.textBoxUsuario.Focus();
            }
        }
        private void setupPanels(){
             this.panelCadastro.Visible = this.radioButton1.Checked;
            this.panelPerfis.Visible = this.radioButton2.Checked;
            this.panelObjetos.Visible = this.radioButton3.Checked;
       }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            setupPanels();
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            setupPanels();
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            setupPanels();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            this.timer1.Enabled = false;
            setupPerfisObjetos();
        }

     }
}
